package com.ruoyi.yf.service;

import com.ruoyi.system.domain.SysDept;
import com.ruoyi.yf.domain.YfTag;
import com.ruoyi.yf.domain.mobile.*;

import java.util.Date;
import java.util.List;

/**
 * 条形码Service接口
 *
 * @author XiaoYi...
 * @date 2020-03-17
 */
public interface IYfTagService {
    /**
     * 查询条形码
     *
     * @param codeid 条形码ID
     * @return 条形码
     */
    public YfTag selectYfTagById(String codeid);

    /**
     * 查询条形码列表
     *
     * @param yfTag 条形码
     * @return 条形码集合
     */
    public List<YfTag> selectYfTagList(YfTag yfTag);

    /**
     * 新增条形码
     *
     * @param yfTag 条形码
     * @return 结果
     */
    public int insertYfTag(YfTag yfTag);

    /**
     * 修改条形码
     *
     * @param yfTag 条形码
     * @return 结果
     */
    public int updateYfTag(YfTag yfTag);

    /**
     * 批量删除条形码
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    public int deleteYfTagByIds(String ids);

    /**
     * 批量标记删除
     *
     * @param ids
     * @return
     */
    public int updateRremoveAndRecoveryTagByIds(String ids, String status);

    /**
     * 删除条形码信息
     *
     * @param codeid 条形码ID
     * @return 结果
     */
    public int deleteYfTagById(String codeid);

    /**
     * XiaoYi...
     * 查询条形码 关联医院查询 唯一
     *
     * @Date : 2020-03-17 18:02
     */
    public List<YfTag> selectYfTagListOnly(YfTag yfTag);


    /**
     * 查询当前入库数据
     *
     * @param uid
     * @return
     */
    public List<YfTag> selectInpSM(Long uid);


    /**
     * 查询未出库完成的医废列表
     */
    List<YfTag> getNoOutStoreCompleteYF(Long sid,Long ksid);


    /**
     * 查询当前出库数据
     *
     * @param uid
     * @return
     */
    List<YfTag> selectOutSM(Long uid);


    /**
     * 批量添加医废
     *
     * @param tags
     * @return
     */
    int insertYfTagList(List<YfTag> tags);

    // 批量添加医废
    int insertBatchYfTagList(List<YfTag> list);


    /**
     * 批量出库
     *
     * @param ids
     * @return
     */
    int updateSMS(Long uid, String[] ids);


    /**
     * 根据暂存点id、uid查询最后一次入库日期
     *
     */
    Date getLastInputTimeBySidAndUid(String sid, String uid);

    /**
     * 根据暂存点id、uid查询最后一次出库日期
     *
     */
    Date getLastOutTimeBySidAndUid(String sid, String uid);


    /**
     * 根据暂存点id、uid查询当前暂存量
     *
     */
    Double getCurrentInventoryBySidAndUid(String sid, String uid);


    /**
     * 根据暂存点id查询暂存预警值
     *
     */
    List<YfLStoreValue> getStoreValueBySid(String sid);


    /**
     * 医废类型日统计查询
     *
     * @param uid
     * @param date
     * @return
     */
    List<YfTypeStatis> selectUnionAll(String uid, String date);


    /**
     * 查询今天各医废状态袋数
     *
     * @param uid
     * @return
     */
    String getTodayYFNum(Long uid);


    /**
     * 上传医废照片
     *
     * @param codeId
     * @param imgPath
     */
    void saveIMG(String codeId, String imgPath, String yfStatusFlag);

    /**
     * 根据暂存点id去视图查询医院id
     *
     * @param stagingId
     * @return
     */
    SysDept getHospitalByStaging(Long stagingId);


    /**
     * 根据条码获取医废信息，联查各状态人员姓名
     */
    YfTag getYFInfoByBarcode(String codeId);


    /**
     * 根据条码和暂存点获取医废信息，联查各状态人员姓名
     */
    YfTag getYFInfoByBarcodeAndStagingId(String codeId, Long stagingId);


    /**
     * 根据暂存点id查询已收集医废(按收集员姓名分组)
     */
    List<YfUserBag> getAlreadyCollYFByDeptId(Long stagingId);

    /**
     * 根据暂存点id查询已转运医废(按转运员姓名分组)
     */
    List<YfUserBag> getAlreadyTransYFByDeptId(Long stagingId);

    /**
     * 根据暂存点id查询已入库医废(按入库员姓名分组)
     */
    List<YfUserBag> getAlreadyInStoreYFByDeptId(Long stagingId);


    /**
     * 根据暂存点、收集人、医废状态查询医废
     */
    List<YfTag> getStatusYF(Long stagingId, Long userId, String yfStatus, Long workId);


    /**
     * 收集 -> 转运 医废
     */
    void collToTransYF(String codeId, Long userId);

    /**
     * 收集 -> 入库 医废
     */
    void collToInStoreYF(String codeId, Long userId);

    /**
     * 转运 -> 入库 医废
     */
    void transToInStoreYF(String codeId, Long userId);

    /**
     * 入库 -> 出库 医废
     */
    void inStoreToOutStoreYF(String codeId, Long userId);

    /**
     *  一键入库 收集 -> 入库
     */
    void oneKeyCollToInStoreYF(Long stagingId, Long userId);

    /**
     *  一键入库 转运 -> 入库
     */
    void oneKeyTransToInStoreYF(Long stagingId, Long userId);

    /**
     *  一键出库 入库 -> 出库
     */
    void oneKeyOutStoreYF(Long stagingId, Long userId);


    /**
     * 根据采集人查询当日各科室各类型医废重量及袋数
     */
    List<YfTag> getTodayEachKSYFWeightAndNumByUserId(Long stagingId, Long userId, Date date);


    /**
     * 根据采集人查询指定月份各科室医废重量及袋数
     */
    List<YfHospitalMonth> getMonthKSYFWeightAndNumByUserId(Long stagingId, Long userId, String date);

    /**
     * 按条件查询医废历史记录
     */
    List<YfTag> getYFRecordByCondition(Integer pageNo, Integer pageSize, Long userId, Long stagingId,
                                       String yftype, String startDate, String endDate);

    /**
     * 获取医院医废统计报表
     */
    List<YfTag> getYFSatisticalByHospitalId(Long userId, Long hospitalId, String startDate, String endDate);


    // 批量添加医废（用于数据迁移）
    void saveYfTagList(List<YfTag> yfTagList);

    // 查询旧平台医废
    List<OldYF> getOldYF(int startIndex, int yfLength);

    // 查询旧平台照片
    List<OldPhoto> getAllOldPhoto();

    // 查询旧平台医废总数
    int getAllOldYFNum();

    // 保存部分出库医废list
    int savePartOutStoreYF(List<YfTag> zyfList);

    // 大批量添加测试数据到数据库
    void insertYFBatchData(List<YfTag> list);

    // 接口 - 批量添加医废
    void insertInterfaceYfTagList(List<YfTag> list);

    // 接口 - 批量更新医废
    void updateInterfaceYfTagList(List<YfTag> list);


    // 查询石家庄卫健委下属的所有暂存点未提交的医废数据
    List<YfTag> getNoSubmitYF(Long deptId);

    // 根据提交的条码和状态更改update_status
    void updateStatusYFBycodeidAndStatus(List<YfTag> yfTagList);

    // 先根据id批量删除医废，再批量添加医废
    void receiveYFData(List<YfTag> yfTagList);


    // 查询石家庄卫健委下所有的暂存点，更改暂存点填报时间
    List<Long> getStagingIdsBySJZWJWID(Long sjzwjwid);

    // 石家庄卫健委服务器接收今日无医废暂存点ids
    void receiveNoYFStagingIds(List<Long> staginglist);



    // 根据暂存点id或医院id查询医废(按科室分组)
    List<YfVehicle> getStatusYFByDeptIdGroupByKS(Long stagingId, Long hospitalId, String yfStatus);

    // 根据科室id及医废状态查询未入库医废总袋数及重量
    YfVehicle getYFTotalByKsIdAndYFStatus(Long stagingId, Long ksId, String yfStatus);

    // 只有指定科室已收集状态才能修改成已入库状态
    void oneKSCollToInStoreYF(Long stagingId, Long ksId, Long userId);

    // 只有指定科室已入库状态才能修改成已出库状态
    void oneKSInToOutStoreYF(Long stagingId, Long ksId, Long userId);

    // 根据科室id及医废状态查询医废
    List<YfVehicle> getStatusYFByKSId(Long stagingId, Long ksId, String yfStatus);

    // 根据医废状态、用户等查询当天医废汇总
    List<YfTypeStatis> getDayYFStatusStatis(Long userId, Long stagingId, Long hospitalId, String yfStatus, String day);

    // 选择出库-查询已入库的医废列表
    List<YfTag> getInStoreYFlistByStagingId(Long stagingId, Long ksId);

    // 选择出库-医废出库
    int saveOutStoreYFlist(List<YfTag> yfList, Long userId);


    // 查询扫码科室今天的医废列表
    List<YfTag> getDepartmentTodayYFTypeList(Long stagingId, Long ksId, Long userId);

    // 查询当前用户今天收集科室的医废列表
    List<YfTag> getAllKSTodagYFListByUserId(Long stagingId, Long userId);

    // 保存医废收集页面第二张照片
    void saveCollPhoto2(String codeId, String imgPath);

    List<YfTag> selectDisposalCompanyYfTagList(YfTag yfTag, Long deptId);
}
